//
//  DispathSourceTimeDemo.h
//  GCDDemo
//
//  Created by kingboyrang on 2021/11/2.
//  Copyright © 2021 wulanzhou. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 定时器
 
 可以使用dispatch_source_create函数创建Dispatch Source，该函数有四个参数：

 type：第一个参数用于标识Dispatch Source要监听的事件类型，共有11个类型。
 handle：第二个参数是取决于要监听的事件类型，比如如果是监听Mach端口相关的事件，那么该参数就是mach_port_t类型的Mach端口号，如果是监听事件变量数据类型的事件那么该参数就不需要，设置为0就可以了。
 mask：第三个参数同样取决于要监听的事件类型，比如如果是监听文件属性更改的事件，那么该参数就标识文件的哪个属性，比如DISPATCH_VNODE_RENAME。
 queue：第四个参数设置回调函数所在的队列。
 NSTimeInterval period = 0.1; //设置时间间隔
                 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);//dispatch_source_t _timer 类型的
 ======================================================================================
 
 dispatch_suspend(queue) //挂起队列

 dispatch_resume(source) //分派源创建时默认处于暂停状态，在分派源分派处理程序之前必须先恢复

 dispatch_source_merge_data //向分派源发送事件，需要注意的是，不可以传递0值(事件不会被触发)，同样也不可以传递负数。

 dispatch_source_set_event_handler //设置响应分派源事件的block，在分派源指定的队列上运行

 dispatch_source_get_data //得到分派源的数据

 uintptr_t dispatch_source_get_handle(dispatch_source_t source); //得到dispatch源创建，即调用dispatch_source_create的第二个参数

 unsigned long dispatch_source_get_mask(dispatch_source_t source); //得到dispatch源创建，即调用dispatch_source_create的第三个参数

 void dispatch_source_cancel(dispatch_source_t source); //取消dispatch源的事件处理--即不再调用block。如果调用dispatch_suspend只是暂停dispatch源。

 long dispatch_source_testcancel(dispatch_source_t source); //检测是否dispatch源被取消，如果返回非0值则表明dispatch源已经被取消

 void dispatch_source_set_cancel_handler(dispatch_source_t source, dispatch_block_t cancel_handler); //dispatch源取消时调用的block，一般用于关闭文件或socket等，释放相关资源

 void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler); //可用于设置dispatch源启动时调用block，调用完成后即释放这个block。也可在dispatch源运行当中随时调用这个函数。
     
 
 
 */

NS_ASSUME_NONNULL_BEGIN

@interface DispathSourceTimeDemo : NSObject

/**
 60倒计时
 */
- (void)countdownWithTimes:(int)seconds progress:(void(^)(int remainSecond))progressBlock finished:(void(^)(void))completed;

/**
 事件派发
 */
- (void)eventSourceWithCompleted:(void(^)(void))completed event:(void(^)(void))target;

/**
 挂起操作
 */
- (void)suspend;

/**
 进度条例子
 */
- (void)progressDemo;

@end

NS_ASSUME_NONNULL_END
